前言与科普

最近在做户外相关的项目,需要详细记录经纬度,并且要求使用大地2000的经纬度标准。

不同标准、或者说参考系坐标,同一个经纬度在地图上的实际位置是不同的。

比如说,我们在高德地图上指定一下广州塔的地铁站:https://www.amap.com/?p=BV10015731,23.106483,113.323464

从链接就能看出来,经纬度为23.106483,113.323464。

然后上百度地图,直接搜索这个经纬度,会发现位置飘到了其他地方。

这是因为百度地图使用的经纬度坐标系与高德地图的不一样。

再用一下我安装的奥维地图,一样输入这个经纬度,指出来的又是另一个位置了。

因为项目要求使用大地2000,也就是CGCS2000来标注点位经纬度,因此才需要使用奥维地图这个一般人都没听过的软件来标注。

奥维地图可以修改地图使用的坐标系,不过奥维地图里要查看CGCS2000坐标系的经纬度只能通过导出的时候切换。

然而导出文本类文件需要付费:

但值得注意的是,导出ovkml格式的话,是免费的,这个格式的文件本质是用来导入地图标点的,与默认的ovobj格式一样。

但是有个不同的点在于ovkml是很简单的修改自kml格式,可以被文本编辑工具打开:

注:如果用记事本打开,会显示乱码,但只要把文件后缀从ovkml改成kml,就可以用记事本打开了。

眼尖的话,就能发现这一段内容里就是经纬度的值了。

1
<coordinates>113.31762046,23.10885035,0</coordinates>

解决方案

使用python遍历文件内的点位名称与经纬度,生成excel表格文档。

脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import xml.etree.ElementTree as ET
import pandas as pd
import os

def extract_elements(file_path):
try:
# 解析XML文件
tree = ET.parse(file_path)
root = tree.getroot()

# 准备存储数据的列表
data = []

# 尝试不同的XPath来查找Placemark元素
placemarks = root.findall('.//Placemark') or root.findall('.//{*}Placemark')
print(f"找到 {len(placemarks)} 个Placemark元素")

for placemark in placemarks:
name = placemark.find('name') or placemark.find('.//{*}name')
coordinates = placemark.find('.//coordinates') or placemark.find('.//{*}coordinates')

if name is not None and coordinates is not None:
coords = coordinates.text.strip().split(',')
if len(coords) >= 2:
data.append({
'Name': name.text,
'Longitude': coords[0],
'Latitude': coords[1]
})
print(f"提取到点位: {name.text}")
else:
print(f"警告: 坐标格式不正确 - {coordinates.text}")
else:
print("警告: 未找到name或coordinates元素")

# 创建DataFrame
df = pd.DataFrame(data)

# 生成与输入文件同名的Excel文件名
input_filename = os.path.splitext(os.path.basename(file_path))[0]
output_filename = f"{input_filename}.xlsx"
output_path = os.path.join(os.path.dirname(file_path), output_filename)

# 保存为Excel文件
df.to_excel(output_path, index=False)
print(f"数据已提取并保存到 {output_path}")
print(f"共提取了 {len(data)} 条记录")

except ET.ParseError as e:
print(f"解析XML文件时出错: {e}")
except Exception as e:
print(f"发生错误: {e}")

# 主程序
if __name__ == "__main__":
file_path = input("请输入OVKML文件的路径: ")
extract_elements(file_path)

使用方法

  1. 浏览器搜索python,去官网下载并安装python;

    安装过程中选择”Add Python to PATH”选项。

  2. 打开CMD/power shell命令行窗口,输入以下命令安装所需的python插件:

    python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple lxml pandas openpyxl

  3. 自己选个位置新建一个文件,用文本编辑软件打开,粘贴上面的脚本代码,保存,修改文件名为extractor.py或其他以.py结尾的自定义名称。

  4. 输入python 文件所在目录\extractor.py,以运行脚本

    例如:文件存放在D盘目录,则输入python D:\extractor.py

  5. 按回车运行脚本后,等待提示“请输入OVKML文件的路径:”再输入ovkml文件所在位置以及文件名。

    例如:D:\magiku\Desktop\广州塔地铁.ovkml